﻿#ifndef __PROTOCOL_H__
#define __PROTOCOL_H__

#include "comm.h"
#include "datadef.h"

#pragma pack(1)//设定为1字节对齐

// 和下位机的通讯协议

/*
// 通讯数据包定义

一、数据包格式

    1. 固定长度数据包格式

        |-------------------------------------------------------------------|-----------|
        |	数据识别序列		|					数据内容						|	校验字	|
        |-------------------------------------------------------------------|-----------|
        |	B0	B1	B2	B3	|	B4	B5	|	B6	B7	B8	B9	B10	B11	B12	B13	|	B14	B15	|
        |-------------------------------------------------------------------|-----------|
        |	固定序列如下		|			|		参数，不同命令定义不同          | B4--B13的	|
        |					|  数据包ID	|		具体定义参考命令详细说明        |			|
        |  'F','L','D','P'	| 			|									|  16位CRC	|
        |-------------------------------------------------------------------|-----------|

    2. 可变长度数据包格式

        |---------------------------------------------------------------------------|-----------|----------------
        |	数据识别序列		|					数据内容								|	校验字	|	附加数据		|
        |---------------------------------------------------------------------------|-----------|---------------|
        |	B0	B1	B2	B3	|	B4	B5	|	B6	B7	|	B8	B9	|	B10	B11	B12	B13	|	B14	B15	|	B16--Bn		|
        |---------------------------------------------------------------------------|-----------|---------------|
        |	固定序列如下		|			|	附加	    |	附加	    |	参数，不同命令     | B4--B13的	|	数据内容      |
        |					|  数据包ID	|	数据	    |	数据	    |	定义不同，定义     |			|               |
        |  'V','L','D','P'	| 			|	长度	    |  校验字	    |  参考命令详细说明    |  16位CRC	|				|
        |---------------------------------------------------------------------------|-----------|---------------|

        附加数据长度取值范围为 0--1024


//------------------------------------
二、通讯命令一览表

    1. 上位机发送命令

            名称			符号			代码	类型	回复			说明
        读取机器信息	UCMD_GET_MC_INFO		0x0001	FLDP	有		机器信息包括机器种类，配置，控制系统版本等信息
        读取机器状态	UCMD_GET_MC_STATUS		0x0002	FLDP	有		读取机器的运行状态，包括机器工作状态，常用输入状态，电机位置，工作进度，文件信息等。
        读取机器参数	UCMD_GET_MC_PARAS		0x0003	FLDP	有		读取内存中机器参数列表
        读取内存数据	UCMD_GET_MEM_DATA		0x0004	FLDP	有		读取机器存储器数据，包括片内SRAM，片外SRAM，NAND FLASH等的内容
        读取传感信号	UCMD_GET_SENSORS		0x0005	FLDP	有		读取IO信号状态及电机位置，编码器位置等信息
        读取文件信息	UCMD_GET_FILE_INFO		0x0006	FLDP	有		读取数据文件的信息
        读取传输结果	UCMD_GET_TRANS_RESULT	0x0007	FLDP	有		读取文件传输的结果位图，包括数据文件和升级文件
        读取传感器位图 UCMD_GET_SENSOR_BMP     0x0008	FLDP    有       读取传感器配置位图

        设置机器配置	UCMD_SET_MC_CONFIG		0x0101	VLDP	无		设置机器的配置，包括信号使用的端口等信息
        设置机器状态	UCMD_SET_MC_STATUS		0x0102	FLDP	无		设置机器的工作状态，包括是否允许工作，清除报警等。
        设置机器参数	UCMD_SET_MC_PARAS		0x0103	VLDP	无		传输机器参数列表到下位机
        设置内存数据	UCMD_SET_MEM_DATA		0x0104	FLDP	无		改变某个内存单元的数据内容
        设置文件参数  UCMD_SET_FILE_PARAS		0x0105  FLDP    无      设置文件参数
        设置执行进度  UCMD_SET_EXEC_PROGRESS	0x0106  FLDP    无      设置文件执行进度
        设置分期密码	UCMD_SET_INSTALLMENT	0x0107  FLDP    无      设置分期密码
        设置经过的时间	UCMD_SET_ELAPSED_TIME	0x0108  FLDP    无      设置经过的时间
        设置默认参数	UCMD_SET_DEF_PARA		0x0109  FLDP    无      设置默认参数

        手动控制命令	UCMD_ACT_BYHAND			0x0201	FLDP	无		手动控制电机转动，OUTPUT信号开关等动作
        机器工作命令	UCMD_MC_WORK			0x0202	FLDP	无		控制机器的工作命令，包括启动，停止，结束，或运动到某个位置等
        移动XY命令	UCMD_MOVE_TO			0x0203	FLDP	无		移动XY到坐标

        启动文件传输	UCMD_START_TRANS		0x0301	VLDP	无		启动文件传输
        文件传输命令	UCMD_TRANS_FILE_DATA	0x0302	VLDP	无      传输文件数据包
        设置文件列表	UCMD_SET_FILE_LIST		0x0304	VLDP    无      设置文件列表
        获取文件列表	UCMD_GET_FILE_LIST		0x0305	FLDP    有      获取下位机文件列表

        下位机升级	UCMD_MC_UPDATE			0x0401	VLDP	无		包括升级主控，外围板控制器等

    2. 下位机发送命令

            名称              符号                  代码	类型      回复			说明
        发送机器信息      DCMD_SEND_MC_INFO		0x8001	VLDP	无		发送机器信息包括机器种类，配置，控制系统版本等信息
        发送机器状态      DCMD_SEND_MC_STATUS		0x8002	VLDP	无		发送取机器的运行状态，包括机器工作状态，常用输入状态，电机位置，工作进度，文件信息等。
        发送机器参数      DCMD_SEND_MC_PARAS		0x8003	VLDP	无		发送内存中机器参数列表
        发送内存数据      DCMD_SEND_MEM_DATA		0x8004	VLDP	无		发送机器存储器数据，包括片内SRAM，片外SRAM，NAND FLASH等的内容
        发送传感信号      DCMD_SEND_SENSORS		0x8005	VLDP	无		发送IO信号状态及电机位置，编码器位置等信息
        发送文件信息      DCMD_SEND_FILE_INFO		0x8006	VLDP	无		发送数据文件的信息
        发送传输结果      DCMD_SEND_TRANS_RESULT	0x8007	VLDP	无		发送文件传输的结果位图
        发送传感器位图     DCMD_SEND_SENSOR_BMP	0x8008	VLDP    无   	发送传感器配置位图
        发送张力传感器值	DCMD_SEND_TENSION		0x8009	VLDP    无   	发送张力传感器值
*/

// 上位机发送命令
#define	UCMD_GET_MC_INFO                   0x0001		// 读取机器信息
#define	UCMD_GET_MC_STATUS              0x0002		// 读取机器状态
#define	UCMD_GET_MC_PARAS                0x0003		// 读取机器参数
#define	UCMD_GET_SENSORS                   0x0005		// 读取传感信号
#define	UCMD_GET_TRANS_RESULT	       0x0007		// 读取传输结果
#define	UCMD_GET_SENSOR_BMP		       0x0008		// 读取传感器位图
#define	UCMD_GET_TENSION_DAT           0x0009		// 读取张力数据
#define    UCMD_GET_LOT_DATA                 0x000D		// 读取物联网数据
#define	UCMD_SET_MC_CONFIG		       0x0101		// 设置机器配置
#define	UCMD_SET_MC_STATUS		           0x0102		// 设置机器状态
#define	UCMD_SET_MC_PARAS		           0x0103		// 设置机器参数
#define	UCMD_SET_MEM_DATA		           0x0104		// 设置内存数据
#define	UCMD_SET_FILE_PARAS		           0x0105		// 设置文件参数
#define	UCMD_SET_EXEC_PROGRESS	       0x0106		// 设置执行进度
#define	UCMD_SET_INSTALLMENT	           0x0107		// 设置分期密码
#define	UCMD_SET_ELAPSED_TIME	       0x0108		// 设置经过的时间
#define	UCMD_SET_DEF_PARA		           0x0109		// 设置默认参数
#define	UCMD_ACT_BYHAND			           0x0201		// 手动控制命令
#define	UCMD_MC_WORK			               0x0202		// 机器工作命令
#define	UCMD_MOVE_TO			               0x0203		// 移动XY到坐标
#define   UCMD_MOVE_OFST	                   0x0205		// XY移动偏移量
#define	UCMD_START_TRANS		           0x0301		// 启动文件传输
#define	UCMD_TRANS_FILE_DATA	           0x0302		// 文件传输命令
//#define	UCMD_TRANS_FILE_DATA            0x0303		// 文件失效命令
#define	UCMD_SET_FILE_LIST		               0x0304		// 设置文件列表
#define	UCMD_GET_FILE_LIST		               0x0305		// 获取下位机文件列表
#define	UCMD_MC_UPDATE			           0x0401		// 下位机升级


// 下位机发送命令
#define	DCMD_REQUEST_DAT		           0x8000		// 请求文件数据
#define	DCMD_SEND_MC_INFO		           0x8001		// 发送机器信息
#define	DCMD_SEND_MC_STATUS		       0x8002		// 发送机器状态
#define	DCMD_SEND_MC_PARAS		       0x8003		// 发送机器参数
#define	DCMD_SEND_SENSORS		           0x8005		// 发送传感信号
#define	DCMD_SEND_FILE_INFO		           0x8006		// 发送文件信息
#define	DCMD_SEND_TRANS_RESULT	   0x8007		// 发送传输结果
#define	DCMD_SEND_SENSOR_BMP	       0x8008		// 发送传感器位图
#define   DCMD_SEND_LOTDATA                 0x800D		// 发送物联网数据



// 三、命令详解
/*
    工作流程
    1. 上位机发送 UCMD_GET_MC_INFO 命令, 命令格式如下：

        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|
        |	数据识别序列		|                            数据内容                                    |	校验字	|
        |-------------------|-----------------------------------------------------------------------|-----------|
        |	B0	B1	B2	B3	|	    B4	B5      |		B6	B7		|	B8	B9	B10	B11 B12	B13     |	B14	B15	|
        |-------------------|-------------------|-------------------|-------------------------------|-----------|
        |	固定序列如下		|	数据包ID         |	命令切换标志字     |	         保留                | B4--B13的	|
        |					|-------------------|-------------------|-------------------------------|			|
        |  'F','L','D','P'	| UCMD_GET_MC_INFO	|	   可能是随机数   	|                               |  16位CRC	|
        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|

    2. 下位机收到后，回复 DCMD_SEND_MC_INFO 命令, 格式定义如下

        |-----------------------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	数据识别序列		|					数据内容					          			        |	校验字	|	附加数据		|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	B0	B1	B2	B3	|	     B4	B5	      |	B6	B7	|	B8	B9	|	B10	B11		|	B12	B13	|	B14	B15	|	B16--Bn		|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	固定序列如下		|			          |	  附加   |	附加	    | 和上位机命令    |           | B4--B13的	|	机器信息结构	|
        |					|  DCMD_SEND_MC_INFO  |	  数据   |	数据	    |    相同的      |  保留      |			|				|
        |  'V','L','D','P'	| 			          |	  长度   |  校验字    | 命令切换标志字  |            |  16位CRC	|				|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |-----------------------------------------------------------------------------------------------------------------------|

    3. 上位机收到下位机的回复命令后，通过比对 命令标志切换字 , 可以确认是否是刚刚发送命令的回复（对于连续发送命令有用），根据情况确定是否重新发送命令。

    注意：
        对于没有时序要求的数据包，可以不在意 命令标志切换字。
*/

// 机器信息结构定义
typedef struct
{
    // 0
        char mBoardVerStr[16];		// 主板（n1）板卡版本
        char exBoardVerStr[16];		// 扩展板（n1-1）板卡版本
        char softwareVerStr[32];	// 软件版本
        char buildInfoStr[32];		// 编译日期信息
        char boardId[32];			// 板卡ID
        char installment[32];		// 最后一次的分期密码字符串

    // 160
        char rev1[512-160];

    // 512
        u32 localIP;		// 板卡IP地址
        u32 submask;		// 子网掩码
        u32 gateIP;			// 网关IP
    // 524
        u8 curN1Ver;      //软件编译N1板卡版本
    // 525
        u8 rev2[1024-525];

} __attribute__ ((packed)) MCInfo;

typedef struct
{
    char debugInfoStr[1024];		// 调试信息

} __attribute__ ((packed)) DebugInfo;		// 调试信息

typedef struct
{
    // 0
    char mBoardVerStr[16];		// 主板（n1）板卡版本

    // 4
    char exBoardVerStr[16];		// 扩展板（n1-1）板卡版本

    // 8
    char softwareVerStr[32];     // 软件版本

    // 16
    char boardId[32];               // 板卡ID

    // 24
    char installment[32];           // 最后一次的分期密码字符串

    // 32
    u32 rev10[32];

    // 64
    u32 errorCode;				// 报警信息
    s32 workableTimer;			// 可工作时间计数器，剩余时间计数（分钟为单位）
    u32 bootTimer;				// 开机时间(单位分钟)
    u32 workTimer;				// 工作时间(单位分钟)
    u32 workRpm;				// 工作转速
    u32 curOutCounter;		// 当前产量计数,由界面记录
    u32 totalOutCounter;		// 累计产量计数
    u32 expectedOutput;	    // 产量预设

    u32 spindleZeroSta;		// 主轴零位状态
                                        // bit0:绣花主轴
                                        // bit1:冲孔主轴
                                        // bit2:缝纫主轴

    u32 spindleAngle;			// 主轴角度
    s32 motosPos[6];           // 电机坐标

    // 80
    u32 sensorSignal[8];		// 传感器信号

    // 88
    u32 machinecfg;      //机器配置
                                                       //勾线模式  bit0    0:单独勾线；1:集中勾线
                                                      //锁头模式  bit1      0：电机锁头；1电磁铁锁头
    //89
    u32 sewHeadNumbers;//缝纫机头个数
    //90
    u32 embHeadNumbers; //绣花机头个数
    //91
    u32 embneedleNumbers;//绣花机针个数
    //92
    u32 punchHeadNumbers;//冲孔机头个数
    //93
    u32 punchneedleNumbers;//冲孔机针个数
    //94
    u32 sensonNumbers;//传感器信号总数

    u32 rev20[128-95];

    // 128
    u32 rev30[192-128];

    //192
    u32 rev40[256-192];

} __attribute__ ((packed)) McLotData;	// 主控物联网数据


#define BOARD_VER_LEN		   32				// 外围板程序版本长度
#define MAX_SUPPORT_N5      48
#define MAX_SUPPORT_N6      2
#define MAX_SUPPORT_D86     1

#define	PARA_NUM		256

//动框角度参数
#define    MAX_HOR	12		// 横,下标2最大值,针步
#define	MAX_VER		21		// 竖,下标1最大值,转速

typedef struct
{
    char softwareVerStr[BOARD_VER_LEN];	// 机头板程序版本
    u32 paraBuf[PARA_NUM];  //机头板参数
    u8 nodeType;			// 节点类型
}__attribute__ ((packed)) HeadInfo;

typedef struct
{
    char softwareVerStr[BOARD_VER_LEN];	// 勾剪扣换控制板程序版本
    u32 paraBuf[PARA_NUM];  //换色板参数
}__attribute__ ((packed)) HcpsInfo;

typedef struct
{
    char softwareVerStr[BOARD_VER_LEN];	// D86程序版本
    u32 paraBuf[PARA_NUM];  //换色板参数
}__attribute__ ((packed)) D86Info;

typedef struct
{
    HeadInfo headInfo[MAX_SUPPORT_N5];      //最大支持32个机头
    HcpsInfo hcpsInfo[MAX_SUPPORT_N6];       //最大支持2个N6
    D86Info  d86Info[MAX_SUPPORT_D86];       //1

}__attribute__ ((packed)) ExBoardInfo;


/*
    流程
    1. 上位机发送命令 UCMD_SET_MC_CONFIG, 命令结构定义如下：

        |---------------------------------------------------------------------------------------------------------------|
        |-----------------------------------------------------------------------------------|-----------|---------------|
        |	数据识别序列		|					数据内容					          			|	校验字	|	附加数据		|
        |-----------------------------------------------------------------------------------|-----------|---------------|
        |	B0	B1	B2	B3	|	     B4	B5	      |	B6	B7	|	B8	B9	|	B10	B11	B12	B13	|	B14	B15	|	B16--Bn		|
        |-----------------------------------------------------------------------------------|-----------|---------------|
        |	固定序列如下		|			          |	  附加   | 附加数据   |                   | B4--B13的	|	机器信息结构	|
        |					|  UCMD_SET_MC_CONFIG |	  数据   | 校验字或   |       保留         |			|				|
        |  'V','L','D','P'	| 			          |	  长度   |  字段ID   |                   |  16位CRC	|				|
        |-----------------------------------------------------------------------------------|-----------|---------------|
        |---------------------------------------------------------------------------------------------------------------|

       附加数据结构定义和MCInfo相同。不过前面512字节是只读的信息，不能改变。

    2. 下位机收到命令后，设置相关配置。

*/

// 读取机器状态
/*
    工作流程
    1. 上位机发送 UCMD_GET_MC_STATUS 命令, 命令格式如下：

        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|
        |	数据识别序列		|                            数据内容                                    |	校验字	|
        |-------------------|-----------------------------------------------------------------------|-----------|
        |	B0	B1	B2	B3	|	      B4	B5    |		B6	B7		|	B8	B9	B10	B11 B12	B13     |	B14	B15	|
        |-------------------|---------------------|-----------------|-------------------------------|-----------|
        |	固定序列如下		|	数据包ID           |	命令切换标志字     |	         保留                | B4--B13的	|
        |					|---------------------|-----------------|-------------------------------|			|
        |  'F','L','D','P'	| UCMD_GET_MC_STATUS  |	   可能是随机数   	|                               |  16位CRC	|
        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|

    2. 下位机收到后，回复 DCMD_SEND_MC_STATUS 命令, 格式定义如下

        |-----------------------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	数据识别序列		|					数据内容					          			        |	校验字	|	附加数据		|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	B0	B1	B2	B3	|	     B4	B5	      |	B6	B7	|	B8	B9	|	B10	B11		|	B12	B13	|	B14	B15	|	B16--Bn		|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |	固定序列如下		|			          |	  附加   |	附加	    | 和上位机命令    |           | B4--B13的	|	机器状态结构	|
        |					| DCMD_SEND_MC_STATUS |	  数据   |	数据	    |    相同的      |  保留      |			|				|
        |  'V','L','D','P'	| 			          |	  长度   |  校验字    | 命令切换标志字  |            |  16位CRC	|				|
        |-------------------------------------------------------------------------------------------|-----------|---------------|
        |-----------------------------------------------------------------------------------------------------------------------|

    3. 上位机收到下位机的回复命令后，通过比对 命令标志切换字 , 可以确认是否是刚刚发送命令的回复（对于连续发送命令有用），根据情况确定是否重新发送命令。

    注意：
        1. 对于没有时序要求的数据包，可以不在意 命令标志切换字。
        2. 下位机会在状态发生变化的时候主动发送 DCMD_SEND_MC_STATUS 命令

*/

// 机器状态数据结构定义
typedef struct
{
    // 0
    u32 workStatus;			// 工作状态位图
                            // .0 允许时限。=0，使用时限已到，不允许下位机工作；=1，允许下位机工作；
                            // .1 允许状态。=0，界面钳制，不允许下位机工作；=1，允许下位机工作；
                            // .2 机器状态。=0，手动工作状态; =1，自动工作状态
                            // .3 钥匙状态。=0，关闭状态; =1，打开状态
                            // .4 文件接收标志。= 0，初始状态。= 1，收到了文件
                            // .5 参数接收标志。= 0，初始状态。= 1，收到了参数
                            // .6 正在忙标志。= 0，空闲（可以接收文件和参数）。= 1，工作中（不会接收文件和参数）
                            // .7 上料状态。=0，手动上料状态; =1，自动上料状态
                            // .8 参数更新标志。 =1，下位机更新了参数
                            // .9 模拟工作标志。=1, 处于模拟工作状态
                            // .10 允许扫描条码状态。=1, 允许
                            // .11 允许拍照状态。=1, 允许
                            // .12 正在工作标志
                            // .13 传感信号扫描中标志
                            // .14 相机校准模式中标志
                            // .15
                            // .16
                            // .17
                            // .18
                            // .19 取模板框状态
                            // .20 放模板框状态
                            // .21 匹绣, 0:退出匹绣,主轴归零 1:进入匹绣,扎针,允许移框
                            // .22 断线检测， 0：退出断线检测状态， 1：进入断线检测状态

    // 1
    u32 errorCode;			// 错误代码
    u32 fileIdx;			// 文件序号
    u32 dataIdx;			// 数据索引
    u32 runSpeed;			// 运动速度 主轴转速
    u32 runAction;			// 执行动作代码 *
    u32 runSteps;			// 当前执行步骤 *
    u32 outCounter;			// 产量计数

    // 8
    s32 xPos;               // x电机当前坐标
    s32 yPos;               // y电机当前坐标    
    s32 motosPos3;   //轴3
    s32 motosPos4;           //轴4          粗线布线机也用->剩余梭芯数
    s32 motosPos5;           //轴5
    s32 motosPos6;           //轴6

    u32 traverseState;      // 机头板遍历状态
    u32 workTimer;          // 工作时长
    u32 showSta;            // bit0是平绣ZP主轴是否在位,0是在位，1是不在位
    u32 UThreadBkSta;       // 面线断线状态，每一位对应一个机头
    u32 DThreadBkSta;       // 底线断线状态，每一位对应一个机头
    u32 tempdat2;           // 自定义状态2

    // 20
    s32 btrdPics;			// 底线片数计数
    s32 btrdLength;			// 底线长度计数

    // 22
    u32 colorIdx;			// 色序编码
    s32 needleIdx;			// 针位号

    // 24
    u32 potval;       //电位器值
    u32 tempdat3;        // 提升电机档位值或松紧线位置

    // 26
    //u32 laserIntensity;		// 激光强度
    u32 iterationsNum;		// 反复绣，当前反复次数

    // 27
    s32 workableTimer;		// 可工作时间计数器（分钟）

    u32 needleNum;		// 缝纫针数

    //29
    u32 UThreadBkSta1[32-29];

    u32 tempdat4[8];

    u32 tempdat5[8];

    u32 tempdat6[8];

    u32 tempdat7[8];

} __attribute__ ((packed)) MCStatus;


//机器状态
#define	WORK_STA_ENTIME		0x00000001		// 允许时限
#define	WORK_STA_ENSTATE	    0x00000002		// 允许状态
#define	WORK_STA_WKAUTO		0x00000004		// 工作状态，手动自动
#define	WORK_STA_KEYEN		    0x00000008		// 钥匙开关状态
#define	WORK_STA_FILEOK		    0x00000010		// 文件接收标志。= 0，初始状态。= 1，收到了文件
#define	WORK_STA_PARAOK		0x00000020		// 参数接收标志。= 0，初始状态。= 1，收到了参数
#define	WORK_STA_BUSY		        0x00000040		// 正在忙标志。= 0，空闲（可以接收文件和参数）。= 1，忙中（不会接收文件和参数）
#define	WORK_STA_FEED		        0x00000080		// 上料状态。=0，手动上料状态; =1，自动上料状态
#define	WORK_STA_NEW_PARA	0x00000100		// 参数更新标志。 =1，下位机更新了参数。上位机需要读取下位机的参数文件并更新
#define	WORK_STA_SIMULATE	    0x00000200		// 模拟工作标志。 =1，机器处于模拟工作
#define	WORK_STA_EN_SCAN	    0x00000400		// 扫码允许。 =1，允许扫码状态
#define	WORK_STA_EN_PHOTO	0x00000800		// 拍照允许。 =1，允许拍照状态
#define	WORK_STA_WORKING	0x00001000		// 工作标志。= 1，工作中


//通用错误
#define	ERR_NONE                            0x0000		// 没有错误
#define	ERR_NO_AIR                          0x0002		// 气压不足
#define	ERR_NOT_SAFE                     0x0003		// 安全区域介入
#define	ERR_EXPIRATION                  0x0004		// 使用时限已到
#define	ERR_DRIVER                          0x0005		// 驱动器报警
#define   ERR_FILL_DATA                      0x0006		// 填充数据错误
#define	ERR_NOT_ALLOWED             0x0007		// 不允许工作状态
#define	ERR_CTRL_ERR                       0x0008		// 控制错误
#define	ERR_FPGA_ERR                      0x0009		// 运动控制芯片版本错误
#define	ERR_BUTTON_NOUP            0x000A		// 等待按钮抬起超时
#define	ERR_FPGA_RESET                  0x000B		// FPGA复位错误
#define	ERR_NO_READY                    0x000C		// 外设未就绪
#define	ERR_NO_SEND_ERR              0x000D		// 传输数据错误
#define	ERR_EDTION_ERR                 0x000E		// 程序版本错误
#define	ERR_WORK_DONE                0x000F		// 完成产量
#define   ERR_LMT_POSITIVE               0x0010		// 正向限位
#define   ERR_LMT_NEGATIVE             0x0011		// 反向限位
#define   ERR_RUN_ALM                      0x0012		// 运动报警
#define   ERR_RUN_LIMIT                    0x0013		// 运动限位
#define   ERR_RUN_EMS                      0x0014		// 运动急停
#define	ERR_MV_PARA                      0x0015		// 运动参数错误
#define	ERR_MC_PARA                      0x0016		// 机器参数错误
#define	ERR_IN_PARA                        0x0017		// 输入参数错误
#define	ERR_NOT_WORKSTA			   0x001A		// 不能工作状态
#define	ERR_NOT_MOVESTA			   0x001B		// 禁止移框状态
#define	ERR_MTZ_RIGHT			           0x001F		// 归零成功
#define	ERR_MTZ_ERROR			          0x0020		// 归零错误
#define	ERR_COOR_SYSTM			       0x0021		// 坐标系统错误
#define	ERR_OUT_RANGE			         0x0022		// 目标位置越界
#define	ERR_X_LIT_POSI                     0x0023		// X正向限位
#define	ERR_X_LIT_NEGA                   0x0024		// X反向限位
#define	ERR_Y_LIT_POSI			           0x0025		// Y正向限位
#define	ERR_Y_LIT_NEGA			           0x0026		// Y反向限位
#define	ERR_ALM_WATERTANK		   0x002A		// 水箱报警
#define	ERR_ALM_COVEROPEN		   0x002B		// 开盖报警
#define	ERR_LIGHTCURTAINS1		   0x002C		// 光幕1介入
#define	ERR_LIGHTCURTAINS2		    0x002D    // 光幕2介入
#define	ERR_AIR_POWER			            0x002E		// 气压不足
#define	ERR_NO_DATA                       0x0040		// 无数据
#define	ERR_DATA_ERROR			        0x0041		// 数据错误
#define	ERR_GRAPH_OUT_RANGE		0x0042		// 图形超出范围
#define	ERR_MS_NOT_ZERO			    0x0050		// 主轴不在零位
#define	ERR_HK_NOT_ZERO			    0x0051		// 旋梭不在零位
#define	ERR_MS_NOT_SYNC			    0x0052		// 针梭不同步
#define	ERR_RO_NOT_SYNC			    0x0053		// 旋转不同步
#define	ERR_CUTTER_NOT_POS		0x0054		// 剪刀不在回位
#define	ERR_HEAD_NOT_HIGH		    0x0055		// 机头不在高位
#define	ERR_HEAD_NOT_LOW		    0x0056		// 机头不在低位
#define	ERR_LIGHTCURTAINS		        0x0057		// 光幕介入
#define	ERR_UPER_TBREAK			        0x0058		// 面线断线
#define	ERR_BOBBIN_TBREAK		        0x0059		// 底线断线
#define	ERR_NEEDLE_NOT_HIGH		    0x005A	// 机针不在高位
#define	ERR_SEND_N1CMD_TIMOUT  0x005B	    // 发送主轴命令超时
#define    ERR_SEND_N1CMD_FAIL		    0x005C    // 发送主轴命令失败
#define	ERR_TRANS_TIMEOUT		       0x005D	// 执行命令超时
#define	ERR_NOT_AT_POS			        0x005E		// 模版不到位
#define	ERR_LIFT_TIMEOUT		            0x005F		// 机头升降超时
#define	ERR_YZR_NOT_SYNC		0x020B		// Y向电机不同步
#define	ERR_HEAD_NOT_SAFE		        0x0060		// 机头不在安全区域
#define	ERR_HD1_ND_NOT_ZERO		0x0061		// 机头1针不在零位
#define	ERR_HD1_CUTTER_NOT_POS	 0x0071		// 机头1剪刀不在回位
#define	ERR_R_LIT_POSI			             0x0081		// 旋转正向限位
#define	ERR_R_LIT_NEGA			             0x0082		// 旋转反向限位
#define	ERR_XY_NOT_WP			             0x0085		// XY不在工作位置
#define	ERR_HEAD_NOT_POS		         0x0086		// 机头不到位
#define	ERR_TO_ZERO_TIMOUT		     0x008E		// 等待运动结束超时
#define	ERR_MOVE_POS_ERR		         0x008F		// 移动位置错误
#define	ERR_FOOT_POS			             0x0093		// 压脚位置错误
#define   ERR_FOOT_OUT_RANGE		     0x0094		// 压脚电机位置越界
#define	ERR_LIFT_OUT_RANGE		         0x0095		// 机头升降位置越界
#define	ERR_ROT_OUT_RANGE		     0x0096		// 旋转位置越界
#define	ERR_ROT_ECD_ERROR		         0x0097		// 旋转编码器错误
#define	ERR_LIFT_ULIMIT			             0x0098		// 机头升降上限位
#define	ERR_LIFT_DLIMIT			             0x0099		// 机头升降下限位
#define	ERR_LIFT_SYNC_ERR		         0x009A		// 机头升降同步错误
#define	ERR_NOTIN_SAFE_AREA		     0x009E		// 机头不在安全区域
#define   ERR_LIFT_COOR_SYSTM		0x00CC		// 升降电机坐标系统错误
#define    ERR_BUS_ERR                           0x00AD		// 总线错误
#define	ERR_CHANGE_BOBBIN		     0x00F0		// 更换梭芯
#define	ERR_CHANGE_BOBBIN_A		 0x00F1		// 更换梭芯A
#define	ERR_CHANGE_BOBBIN_B		 0x00F2		// 更换梭芯B
#define	ERR_CHANGE_BOBBIN_STA	 0x00F3		// 机器处于更换梭芯状态
#define    ERR_WORK_HEAD			         0x00D6		// 工作机头错误
#define    ERR_CHANGE_SHUT			     0x00D7		// 换梭异常
#define ERR_ROT_COOR_SYSTM        0x00CB        // 旋转电机坐标系统错误

#define ERR_FEEDPRESS_NOT_HIGH    0x0D20      // 进料压料不在高位
#define ERR_FEEDPRESS_NOT_LOW    0x0D21      // 进料压料不在低位
#define ERR_PULLPRESS_NOT_HIGH    0x0D22      // 拉料压料不在高位
#define ERR_PULLPRESS_NOT_LOW    0x0D23      // 拉料压料不在低位
#define ERR_CLAMPCLOTH_NOT_TIGHTEN    0x0D24    // 夹布不在拉紧位
#define ERR_CLAMPCLOTH_NOT_LOOSEN    0x0D25    // 夹布不在放松位
#define ERR_CLAMPCLOTH_NOT_OPEN    0x0D26      // 夹布不在打开位
#define ERR_CLAMPCLOTH_NOT_CLOSE    0x0D27    // 夹布不在关闭位
#define ERR_PEN_NOT_HIGH        0x0D28      // 画笔不在高位
#define ERR_PEN_NOT_LOW            0x0D29      // 画笔不在低位
#define ERR_UCUT_NOT_HIGH        0x0D2A      // 上剪刀不在高位
#define ERR_UCUT_NOT_LOW        0x0D2B      // 上剪刀不在低位
#define ERR_INSTALLMENT_OK      0x0300        // 密码设置成功
#define ERR_INSTALLMENT_FAIL    0x0301        // 密码设置失败

#define    ERR_CHB_SWAY            0x0219      // 换梭摆动装置         异常
#define    ERR_CHB_PUSH            0x021A      // 换梭推动装置         异常
#define    ERR_CHB_SHUT            0x021C        // 梭壳检测             异常

#define    ERR_CHB_SPIN            0x0230      // 换梭旋转装置         异常
#define    ERR_CHB_DPUSH            0x0231      // 换梭扣线伸缩装置     异常
#define    ERR_WIRE_ALARM            0x00C9      // 扎线报警
#define    ERR_HEAD_NOT_SAFE        0x0060        // 机头不在安全区域
#define ERR_MS_COOR_SYSTM        0x00CF        // 主轴坐标系统错误




// 设置机器状态
/*
    工作流程
    1. 上位机发送命令 UCMD_SET_MC_STATUS, 命令结构定义如下：

        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|
        |	数据识别序列		|                            数据内容                                    |	校验字	|
        |-------------------|-----------------------------------------------------------------------|-----------|
        |	B0	B1	B2	B3	|	    B4	B5       |		B6	B7		|	B8	B9	|  B10	B11 B12	B13 |	B14	B15	|
        |-------------------|--------------------|------------------|-----------|-------------------|-----------|
        |	固定序列如下		|	    数据包ID      |	    状态码       |	参数     |   保留             | B4--B13的	|
        |					|--------------------|------------------|-----------|-------------------|			|
        |  'F','L','D','P'	| UCMD_SET_MC_STATUS |	             	|           |                   |  16位CRC	|
        |-------------------------------------------------------------------------------------------------------|
        |-------------------------------------------------------------------------------------------------------|


    2. 下位机收到命令后，根据状态码设置相关状态。

*/

// 状态码定义如下-设置
#define	MC_STA_CLENA_ERR	    0x0000		// 清除错误
#define	MC_STA_EN_WORK		0x0001		// 允许工作(状态)
#define	MC_STA_DIS_WORK		0x0002		// 禁止工作(状态)
#define	MC_STA_EN_TIME		    0x0003		// 允许工作(时间)
#define	MC_STA_DIS_TIME		    0x0004		// 禁止工作(时间)
#define	MC_CLEAN_COUNT		0x0005		// 产量计数清零
#define	MC_STA_MANUAL		0x0006		// 手动工作状态
#define	MC_STA_AUTO			0x0007		// 自动工作状态
#define	MC_FILE_SWITCH		0x0008		// 文件切换
#define	MC_INVALID_FILE		0x0009		// 文件失效命令
#define	MC_CLEAN_PARA_REF	0x000A		// 清除刷新参数标志
#define	MC_SET_TO_NORMAL	0x000B		    // 设置为正常工作状态
#define	MC_SET_TO_SIMULATE	0x000C		// 设置为模拟工作状态
#define	MC_SET_ERR_STA		    0x000D		// 设置为错误状态（报错）
#define    MC_CLEAN_FIDX               0x000F         // 索引复位
#define	MC_CLEAN_BOBBIN		0x0010		    // 底线计数复位
#define	MC_SET_ENTRY_SCAN_SENSOR     0x0011	 //  设置为 进入 扫描传感器状态
#define	MC_SET_EXIT_SCAN_SENSOR         0x0012	 //  设置为 退出 扫描传感器状态
#define	MC_SET_ENTER_TEST_OUTPUT       0x0013	 //  设置为 进入 测试输出状态
#define	MC_SET_EXIT_TEST_OUTPUT           0x0014	 //  设置为 退出 测试输出状态
#define   MC_STA_EXIT_THREADBK                 0x0024		// 退出断线测试
#define	STA_NORMAL_STOP                        0x0100		// 正常停止
#define	STA_MTZ_SUCCESS                          0x0101		// 归零成功
#define	STA_WORK_PAUSE                           0x0102		// 工作暂停
#define	STA_WORK_OVER                            0x0103		// 工作结束
#define	STA_WORK_FINISH                          0x0104		// 工作完成
#define	STA_WORK_DONE                           0x0105		// 完成产量
#define	STA_EXEC_SUCCESS                         0x0106		// 执行成功
#define	STA_EXEC_FAILED                             0x0107		// 执行失败
#define	STA_WAIT_FILE                                 0x0108		// 等待文件
#define	STA_CHANGE_BOBBIN                     0x0109		// 更换梭芯
#define	STA_PROCESS_FINISH                      0x010A	    // 执行完成
#define	STA_PROCESS_RUNNING                0x010B		// 执行过程中
#define    STA_LINE_TBREAK                            0x0152		// 断线停止


typedef struct
{
    u32 buf[PARA_NUM];
}  __attribute__ ((packed)) ParaStruct;



// 参数类型定义
#define	SEW_MCPARA_MACH        0	// 缝纫机器参数
#define	SEW_MCPARA_WORK		1	// 缝纫工作参数
#define   SEW_MCPARA_DEF_MC	    2	// 出厂默认机器配置参数（读取有效）
#define   SEW_MCPARA_DEF_WK	    3	// 出厂默认机器工作参数（读取有效）
#define   SEW_REVMCPARA_MACH  0x07 // 预留机器配置参数
#define   SEW_REVMCPARA_WORK  0x08 // 预留机器工作参数

//平板机
#define	   DCMD_SEND_MOTO_GAINPARA    0x10    // 电机增益参数(xy)
//五头机
#define	SEW_MCPARA_EX1			0x20	// 机器扩展参数1
#define	SEW_MCPARA_EX2			0x21	// 机器扩展参数2

// 缝纫机器参数
typedef struct
{
// 0
    u32 machineType;	// 机器类型
    u32 productType;	// 产品类型
    u32 headNumbers;	// 机头个数
    u32 needleNumbers;	// 每头机针个数
// 4
    u32 rev0[10-0];

// 10
    u32 xConfig;		// x配置
    u32 yConfig;		// y配置
    u32 x2Config;		// x2配置
    u32 y2Config;		// y2配置

                        // config.0, = 0, 无该轴;				= 1, 有该轴;
                        // config.1, = 0, 单电机驱动;			= 1, 双电机驱动;
                        // config.2, = 0, 坐标系统为正;			= 1, 坐标系统为反;
                        // config.3, = 0, 移动对象为机头			= 1, 移动对象为框;
                        // config.4, = 0, 没有零位传感器;		= 1, 有零位传感器;
                        // config.5, = 0, 没有降速传感器;		= 1, 有降速传感器;
                        // config.6, = 0, 没有正向限位传感器;	= 1, 有正向限位传感器;
                        // config.7, = 0, 没有负向限位传感器;	= 1, 有负向限位传感器;
                        // config.8, = 0, 向负方向找零位传感器;	= 1, 向正方向找零位传感器;
                        // config.9, = 0, 零位单独起作用;		= 1, 零位和降速一起起作用;

    u32 mConfig;	// 缝纫主轴配置
                        // config.0, = 0, 无该轴;				= 1, 有该轴;
                        // config.1, = 0, 针梭一体;				= 1, 针梭分离（双电机）;

    u32 uConfig;		// 升降电机配置
                        // config.0, = 0, 无该轴;				= 1, 有该轴;

    u32 fConfig;		// 压脚电机配置
                        // config.0, = 0, 无该轴;				= 1, 有该轴;

    u32 rConfig;	// 旋转电机配置
                        // config.0, = 0, 无该轴;				= 1, 有该轴;
                        // config.1, = 0, 单电机驱动;			= 1, 双电机驱动;
                        // config.2, = 0, 坐标系统为正;			= 1, 坐标系统为反;
                        // config.3, = 0, 转动对象为机头			= 1, 转动对象为框;
                        // config.4, = 0, 无旋转范围限制			= 1, 有旋转范围限制;
// 18
    u32 cutDTrdDev;		// 下剪刀驱动装置选择, 0, 无下剪线装置; 1, 气缸; 2, 交流电机; 3, 步进电机; 4, 电磁铁
    u32 cutDTrdMode;            // 下剪线模式选择, 0, 静态剪线; 1, 动态剪线; 2, 凸轮剪线; 3, 凸轮分别剪线
    u32 cutUTrdDev;		// 上剪刀驱动装置选择, 0, 无上剪线装置; 1, 气缸;
// 21
    u32 utbdDev;		// 面线断线检测装置选择; 0, 无装置; 1, 挑线簧; 2, 电子断线器;
    u32 dtbdDev;		// 底线断线检测装置选择; 0, 无装置, 1, 光栅轮; 2, 磁编码器;
    u32 tbdMode;		// 断线检测模式选择; 0, 直接检测; 1, 外围板检测;
// 24
    u32 hookTrdDev;		// 勾面线装置选择, 0, 无勾面线装置; 1, 气缸; 2, 电磁铁
    u32 looseTrdDev;            // 松面线装置选择, 0, 无松线装置; 1, 气缸; 2, 电磁铁
    u32 pullTrdDev;		// 拉面线装置选择, 0, 无拉面线装置; 1, 气缸;
    u32 pushTrdDev;		// 扣底线装置选择, 0, 无扣底线装置; 1, 气缸; 2, 电磁铁
    u32 looseTrdDev2;           // 第二松面线装置选择, 0, 无松线装置; 1, 气缸; 2, 电磁铁
    u32 templateId;		// 模版识别装置, 0, 无识别装置; 1, 条形码; 2, 编码孔

// 30
    u32 hookFaceTo;		// 旋梭面对方向, 0, 向前; 1, 向左; 2, 向右; 3, 向上
// 31
    u32 templateDect;	// 模版检测装置, 0, 无检测装置; 1, 检测
    u32 rev1[50-32];

// 50
    // 位置，尺寸
    s32 xSensorPos;			// X框传感器坐标，单位 0.01mm
    s32 ySensorPos;			// Y框传感器坐标，单位 0.01mm
    s32 mStopAng;			// 主轴停车传感器角度，单位 0.01度
    s32 uSensorPos;			// 升降传感器坐标，单位 0.01mm
    s32 fSensorPos;			// 压脚传感器坐标，单位 0.01mm
    s32 rSensorAng;			// 旋转传感器角度，单位 0.01度
// 56
    s32 mHkSensorAng;		// 主轴勾线传感器角度，单位 0.01度
// 57
    s32 pStopAng;			// 冲头停车角度，单位 0.01度
// 58
    s32 cStopAng;			// 裁刀主轴停车角度
// 59
    s32 x2SensorPos;		// X2框传感器坐标，单位 0.01mm
    s32 y2SensorPos;		// Y2框传感器坐标，单位 0.01mm
    s32 plSensorPos;		// 拉料电机传感器坐标，单位 0.01mm
// 62
    s32 mJogSensorAng;		// 主轴点动停车角度，单位 0.01度
    s32 emStopAng;			// 平绣主轴停车角度，单位 0.01度

// 64
    u32 rev2[70-64];

// 70
    s32 xNegaBorder;		// x可移动区域负边界(X-), 范围 -2147483648--2147483647，单位0.01mm
    s32 xPosiBorder;		// x可移动区域正边界(X+), 范围 -2147483648--2147483647，单位0.01mm
    s32 yNegaBorder;		// y可移动区域负边界(Y-), 范围 -2147483648--2147483647，单位0.01mm
    s32 yPosiBorder;		// y可移动区域正边界(Y+), 范围 -2147483648--2147483647，单位0.01mm

// 74
    s32 headudUper;			// 机头升降可移动上边界，单位0.01mm
    s32 headudLower;		// 机头升降可移动下边界，单位0.01mm

// 76
    s32 footudUper;			// 压脚升降可移动上边界，单位0.01mm
    s32 footudLower;		// 压脚升降可移动下边界，单位0.01mm
    u32 fppmmNumerator;		// 电机压脚脉冲当量分子
    u32 fppmmDenominator;	// 电机压脚脉冲当量分母

// 80
    s32 rLimitAnglePosi;	// 旋转范围正向限制角度，单位 0.01度
    s32 rLimitAngleNega;	// 旋转范围正向限制角度，单位 0.01度

// 82
    s32 punchOffsetX;		// 冲孔机头偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32 punchOffsetY;		// 冲孔机头偏移Y, 范围 -2147483648--2147483647，单位0.01mm
    s32	sewingAreaXN;	// x可缝纫区域负边界(X-), 范围 -2147483648--2147483647，单位0.01mm
    s32	sewingAreaXP;	// x可缝纫区域正边界(X+), 范围 -2147483648--2147483647，单位0.01mm
    s32	sewingAreaYN;	// y可缝纫区域负边界(Y-), 范围 -2147483648--2147483647，单位0.01mm
    s32	sewingAreaYP;	// y可缝纫区域正边界(Y+), 范围 -2147483648--2147483647，单位0.01mm
    s32	punchAreaXN;		// x可冲孔区域负边界(X-), 范围 -2147483648--2147483647，单位0.01mm
    s32	punchAreaXP;		// x可冲孔区域正边界(X+), 范围 -2147483648--2147483647，单位0.01mm
    s32	punchAreaYN;		// y可冲孔区域负边界(Y-), 范围 -2147483648--2147483647，单位0.01mm
    s32	punchAreaYP;		// y可冲孔区域正边界(Y+), 范围 -2147483648--2147483647，单位0.01mm

    s32 sewingROffsetX;		// 缝纫右机头偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32 sewingROffsetY;		// 缝纫右机头偏移Y, 范围 -2147483648--2147483647，单位0.01mm

    s32 cutterOffsetX;		// 切刀机头偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32 cutterOffsetY;		// 切刀机头偏移Y, 范围 -2147483648--2147483647，单位0.01mm

    s32	cuttingAreaXN;		// x可裁切区域负边界(X-), 范围 -2147483648--2147483647，单位0.01mm
    s32	cuttingAreaXP;		// x可裁切区域正边界(X+), 范围 -2147483648--2147483647，单位0.01mm
    s32	cuttingAreaYN;		// y可裁切区域负边界(Y-), 范围 -2147483648--2147483647，单位0.01mm
    s32	cuttingAreaYP;		// y可裁切区域正边界(Y+), 范围 -2147483648--2147483647，单位0.01mm

//	u32 rev3[100-100];

// 100
    // 速度参数
    u32 xymvstspSpd;		// xy启动停止速度, 范围 1--100，单位mm/s，默认 10
    u32 xymvzSpd;			// xy归零运行速度, 范围 1--100，单位mm/s，默认 100
    u32 xymvlSpd;			    // xy空走运行速度, 范围 1--1000，单位mm/s，默认 300
    u32 xymvSAdd;			// xy行走加速度, 范围 1--10000，单位mm/s2，默认 1000
    u32 xymvbrkAdd;		// xy刹车加速度 1--10000，单位mm/s2，默认 10000
    u32 xymvhSpd1;			// xy手动移动速度1, 范围 1--1000，单位mm/s，默认 10
    u32 xymvhSpd2;			// xy手动移动速度2, 范围 1--1000，单位mm/s，默认 100
    u32 xymvhSpd3;			// xy手动移动速度3, 范围 1--1000，单位mm/s，默认 300
    u32 xymaxSpd;			// xy最高移动速度, 范围 1--1000，单位mm/s，默认 300

// 109
    u32 msrstspRpm;		// 主轴启动停止转速, 范围 1--300，单位r/min，默认 100
    u32 mstzRpm;			    // 主轴归零转速, 范围 1--3000，单位r/min，默认 120
    u32 msrunRpm;			// 主轴运转转速, 范围 1--3000，单位r/min，默认 300
    u32 msrAddRpss;		// 主轴运转加速度, 范围 1--100，单位r/ss，默认 50
    u32 msrbrkAdd;			// 主轴刹车加速度, 范围 1--100，单位r/ss，默认 100
    u32 msHightRpm;		// 主轴缝纫最高转速, 范围 1--3000，单位r/min，默认 3000

// 115
    u32 ustspSpd;			// 机头升降起停速度, 范围 1--250，单位mm/s，默认 10
    u32 umvtzSpd;		// 机头升降归零速度, 范围 1--250，单位mm/s，默认 50
    u32 umoveSpd;		// 机头升降行走速度, 范围 1--250，单位mm/s，默认 200
    u32 uliftAdd;			// 机头升降行走加速度, 1--10000，单位mm/s2，默认 500
    u32 uBrkAdd;			// 机头升降刹车加速度, 1--10000，单位mm/s2，默认 1000

// 120
    u32 fstspSpd;			// 压脚升降起停速度, 范围 1--100，单位mm/s，默认 10
    u32 fmvtzSpd;			// 压脚升降归零速度, 范围 1--100，单位mm/s，默认 30
    u32 fmoveSpd;		// 压脚升降行走速度, 范围 1--100，单位mm/s，默认 100
    u32 fliftAdd;			// 压脚升降行走加速度, 1--10000，单位mm/s2，默认 500
    u32 fBrkAdd;			// 压脚升降刹车加速度, 1--10000，单位mm/s2，默认 1000

// 125
    u32 rotstspDps;			// 机头旋转启动停止速度, 范围 1--720, 单位 deg/s(度/秒)，默认 10
    u32 rottzDps;			    // 机头旋转归零速度, 1--720, 单位 deg/s(度/秒)，默认 50
    u32 rotrunDps;			// 机头旋转运转速度, 范围 1--720, 单位 deg/s(度/秒)，默认 360
    u32 rotAddDpss;			// 机头旋转运动加速度,  范围 1--10000, 单位 deg/s(度/秒方)，默认 500
    u32 rotBrkDpss;			// 机头旋转刹车加速度,  范围 1--10000, 单位 deg/s(度/秒方)，默认 5000
    u32 rotmaxDps;			// 机头旋转最高速度, 范围 1--720，单位 deg/s，默认 720

// 131
    u32 minDrawSpd;			// 最小画笔绘画速度, 范围 1--100，单位mm/s，默认 10
    u32 maxDrawSpd;			// 最大画笔绘画速度, 范围 1--1200，单位mm/s，默认 1000
    u32 drawAdd;			        // 画笔绘画加速度, 范围 1--4000，单位mm/s2，默认 500
    u32 drawSlowAngle;		// 画笔绘画降速最小偏差角度，范围 0--18000，单位 0.01度，默认 3000

// 135
    u32 rev4[150-135];

// 150
    s32	embOffsetX;			// 平绣机头偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32	embOffsetY;			// 平绣机头偏移Y, 范围 -2147483648--2147483647，单位0.01mm
    s32	embAreaXN;			// 平绣x可绣花区域负边界(X-), 范围 -2147483648--2147483647，单位0.01mm
    s32	embAreaXP;			// 平绣x可绣花区域正边界(X+), 范围 -2147483648--2147483647，单位0.01mm
    s32	embAreaYN;			// 平绣y可绣花区域负边界(Y-), 范围 -2147483648--2147483647，单位0.01mm
    s32	embAreaYP;			// 平绣y可绣花区域正边界(Y+), 范围 -2147483648--2147483647，单位0.01mm
    // 156
    u32 rev5[200-156];

// 200
    s32 penOffsetX;			// 画笔偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32 penOffsetY;			// 画笔偏移Y, 范围 -2147483648--2147483647，单位0.01mm
    s32 PressOffsetX;		// 压枣偏移X, 范围 -2147483648--2147483647，单位0.01mm
    s32 PressOffsetY;		// 压枣偏移Y, 范围 -2147483648--2147483647，单位0.01mm

// 204
    u32 EncoderMolecule;	// 编码器系数分子, 范围 1--100000，单位 无
    u32 EncoderDeno;		// 编码器系数分母, 范围 1--100000，单位 无
    u32 ZeroCutDistance;	// 零切距离,       范围 1--500000，单位 0.01mm
    u32 FeedClothDev;		// 进料装置选择, 0, 无进料装置; 1, 有进料装置
    u32 CrossCutDev;		// 横切装置选择, 0, 无横切装置; 1, 有横切装置
    u32 ClipClothDev;		// 夹布装置选择, 0, 无夹布装置; 1, 有夹布装置
    u32 TensionDev;			// 张紧装置选择, 0, 无张紧装置; 1, 有张紧装置
    u32 SideCutDev;			// 边切装置选择, 0, 无边切装置; 1, 有边切装置

// 212
    u32 rev6[256-212];

} __attribute__ ((packed)) SewingMcPara;



// 缝纫工作参数
typedef struct
{
// 0
    u32 msWorkRpm;			// 主轴缝纫工作转速, 范围 1--3000，单位r/min，默认 2000
    u32 mscutRpm;			    // 主轴剪线转速, 范围 1--500，单位r/min，默认 120
    u32 msRevRpm;		        // 主轴回针转速, 范围 1--500，单位r/min，默认 200
    u32 msStSlowRpm;		    // 主轴启动慢动转速, 范围 1--500，单位r/min，默认 200
    u32 msBackEquRpm;		// 倒车等效主轴转速,, 范围 1--3000，单位r/min，默认 1000
// 5
    u32 sewMoveType;		// 缝纫动框方式, 位图
                                        // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框;
                                        // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速;
                                        // bit2 = 0, 机头连续旋转; bit2 = 1, 机头间歇式旋转;
                                        // bit3 = 0, 机头间歇式脉冲无加减速; bit3 = 1, 间歇式脉冲正弦加减速;
    u32 sewMoveStAng;	// 缝纫动框起始角度, 0--36000, 单位 0.01度，默认 28000
    u32 sewMoveCtnAng;// 缝纫动框持续角度, 0--36000, 单位 0.01度，默认 15000
// 8
    u32 stSlowNum;			// 起针慢动针数, 0--10，单位 针, ，默认 3
    u32 actionWhenStart;	// 起针动作允许; 位图选择, 0, 不允许; 1, 允许; bit0, 松线允许; bit1, 顶线允许; bit2, 夹线允许;

// 10
    u32 cutTrdEn;			        // 剪线允许; 0, 不剪线; 1, 自动剪线; 2, 数据剪线 ，默认1
    u32 cutTrdDivAngle;		// 剪线分线角度，0--36000, 单位 0.01度，默认 20000
    u32 cutTrdEndAngle;		// 剪线完成角度，0--36000, 单位 0.01度，默认 6000
    u32 actionWhenCut;		// 剪线时动作允许, 位图选择, bit0, 松线允许; bit1, 拉线允许; bit2, 夹线允许;

// 14
    u32 tbdNumber;			// 断线检测针数; 0, 不检测断线; 其他, 断线信号连续针数，默认3
    u32 tbdAngle;			    // 断线检测主轴角度，0--36000, 单位 0.01度，默认 3000

// 16
    u32 changeBobbinMode;	// 换梭芯提醒功能, 0, 不启用该功能; 1, 按长度计数延迟提醒; 2, 按片数计数; 3, 按长度立刻提醒; 默认0
    u32 changeBobbinLength;	// 底线长度, 单位 0.01mm，默认 10000000
    u32 cblenFixed;			        // 每针底线修正量, 单位 0.01mm，默认 0
    u32 changeBobbinNums;	// 换梭片数计数, 单位 次，默认 0

// 20
    u32 oilMode;			    // 加油方式选择, 0, 不加油; 1, 按工作时间间歇加油; 2, 按工作针数间歇加油; 3, 持续不停加油，默认0
    u32 addOilGapStitch;	// 加油针数间隔, 单位针, 加油方式为按针数加油时有用，默认 10000
    u32 addOilGapTime;	// 加油时间间隔, 单位秒, 加油方式为按工作时间加油时有用;
    u32 addOilTime;			// 加油持续时长, 单位秒,

// 24
    u32 finishStopSel;		// 完成后停车位置选择, 0, 当前位置; 1，起点，2，定位点，3，上料点; 4，偏移点

// 25
    u32 offsetEn;			// 偏移点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效
    s32 offsetX;
    s32 offsetY;			// 偏移点坐标
// 28
    u32 fixPosEn;			// 穿线点坐标有效标志; 0, 无效; 1, x有效; 2, y有效; 3, xy同时有效
    s32 fixPosX;
    s32 fixPosY;			// 穿线点坐标
// 31
    s32 headLowPos;			// 机头升降低位高度
    s32 headHighPos;		// 机头升降高位高度

// 33
    u32 expectedOutput;		// 产量预设
// 34
    u32 lightingBrightness;	// 照明亮度，0--255; 默认128
// 35
    u32 delayAfterFrameClose;	// 气框关闭后延时, 0--2000, 单位ms, 默认500
// 36
    u32 msAddRpss;			// 缝纫加速度, 1--100, 单位r/ss , 默认5
// 37
    u32 cutXYMovement;		// 剪线动框位移, 1--1000, 单位0.01mm, 默认500
// 38
    u32	sewingBlowEn;		// 缝纫吹气允许, 0, 不允许; 1, 允许
    u32	punchBlowEn;		// 冲孔吹气允许, 0, 不允许; 1, 允许
    u32 cleanerCloseDelay;	// 吸尘器关闭延时，单位秒
// 41
    u32 pmWorkRpm;			// 冲孔主轴工作转速, 范围 1--3000，单位r/min，默认 2000
    u32 pmAddRpss;			// 冲孔加速度, 1--100, 单位r/ss , 默认20

    u32 pmMoveType;			// 冲孔动框方式, 位图
                                            // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框;
                                            // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速;
    u32 pmMoveStAng;		// 冲孔动框起始角度, 0--36000, 单位 0.01度，默认 24000
    u32 pmMoveCtnAng;		// 冲孔动框持续角度, 0--36000, 单位 0.01度，默认 15000

// 46
    u32 liftHeadWhenSewing;	// 缝纫间越框机头升降, 0, 不允许; 1, 允许
    u32 liftHeadWhenPunch;	// 冲孔间越框机头升降, 0, 不允许; 1, 允许
// 48
    u32 actionWhenMove;		// 移框时动作选择; 位图选择, 0, 不允许; 1, 允许; bit0, 松线允许; bit2, 夹线允许;
// 49
    u32 softwareLimit;		// 软件限位; 位图选择, 0, 不允许; 1, 允许; bit0, xy移动; bit1, 缝纫头升降限制; bit2, 冲孔头升降限制; bit3, 裁刀机头升降限制

// 50
    s32 changeBobbinAng;	// 换梭旋转机头角度, 0--36000, 单位 0.01度，默认 18000
    u32 rotMoveCtnAng;		// 旋转持续角度, 0--36000, 单z位 0.01度，默认 36000
// 52
    u32 hookThreadNum;		// 面线勾线针数，1--5，单位 针，默认1
    u32 sewFootHeight;		// 缝纫工作时压脚高度，单位 0.01mm
    u32 simuHeadHeight;		// 模拟工作时机头高度，单位 0.01mm
// 55
    u32 cutterWorkRpm;		// 切刀工作转速, 范围 1--3000，单位r/min，默认 1200
    u32 cutterAddRpss;		// 切刀加速度, 1--100, 单位r/ss , 默认20

// 57
    u32 cutMoveDir;			// 剪线动框方向, 0, 不动框; 1, 向左; 2, 向前; 3, 向右; 4, 向后

// 58
    u32 pressKnotHigh;		// 压枣升降行程，单位 0.01mm

// 59
    u32 msCornerRpm;		// 主轴拐角转速, 范围 1--3000，单位r/min，默认 1000
    u32 slowAngle;			// 降速最小偏差角度，单位度，范围0--180,默认 180

// 61
    u32 rev2[100-61];
// 100
    u32 workHeadSel;		// 工作机头选择，位图选择，共支持32个机头; 0, 不允许工作; 1, 允许工作;	bit0 第一个机头, bit1, 第二个机头......
    u32 safetyEn;			    // 安全输入允许，位图选择，0, 不允许; 1, 允许;		bit0 光幕; bit1, 气压; bit2 上电信号
    u32 autoFrameEn;		// 自动气框允许，0, 不允许; 1, 允许;
    u32 autoFrameDelay;	// 自动气框闭合延时，单位ms
    u32 sewoffsetAsCmd;	// 线迹偏移功能，0, 不允许; 1, 允许;
    u32 autoworkstart;		// 循环工作功能，0, 不允许; 1, 允许;
    u32 workHeadSelR;		// 右工作机头选择，位图选择，共支持32个机头; 0, 不允许工作; 1, 允许工作;	bit0 第一个机头, bit1, 第二个机头......
    u32 PullingPos;			// 拉料电机拉料位置，单位 0.01mm
    u32 pullingLength;		// 拉料长度，单位 0.01mm
    u32 cuttingLength;		// 裁切长度，单位 0.01mm

// 110
    u32 addOilHookTime;		// 梭加油持续时长, 单位秒, (针梭独立加油时有效)
    u32 clampingForce1;		// 夹线力度1: 0~100 %
    u32 clampingForce2;		// 夹线力度2: 0~100 %
    u32 clampingForce3;		// 夹线力度3: 0~100 %
    u32 clampingForce4;		// 夹线力度4: 0~100 %

// 115
    u32 emWorkRpm;			// 平绣主轴工作转速, 范围 1--3000，单位r/min，默认 1000
    u32 emAddRpss;			    // 平绣加速度, 1--100, 单位r/ss , 默认5

    u32	emMoveType;			// 平绣动框方式, 位图
                                            // bit0 = 0, xy连续动框; bit = 1, xy间歇式动框;
                                            // bit1 = 0, xy间歇式脉冲无加减速; bit1 = 1, xy间歇式脉冲正弦加减速;
    u32 emMoveStAng;		// 平绣动框起始角度, 0--36000, 单位 0.01度，默认 24000
    u32 emMoveCtnAng;		// 平绣动框持续角度, 0--36000, 单位 0.01度，默认 20000
// 120
    u32 rev3[150-120];

// 150
    u32 rev4[200-150];
// 200
    u32 rev5[256-200];

} __attribute__ ((packed)) SewingWkPara;


//回复的定义
#define REV_TYPE_ONCE       0       // 单次回复；下位机收到命令后发送一次回复数据
#define REV_TYPE_BEGIN      1       // 多次回复；下位机收到命令后，会主动开始发送回复数据，直到被其他命令打断。


// 传感信号位定义，传感器信号位图和传感器信号的位定义相同
typedef struct
{
// 0
    u8 bitmap[1024];

} __attribute__ ((packed)) SensorsBitmap;


// 传输文件类型
#define	FILE_TYPE_DAT		0x00	// 数据文件
#define	FILE_TYPE_PGM		0x02	// 升级文件


// 文件传输控制结构
#define	LEN_RSV_BMP         MAX_EXDP_LEN                                       // 位图大小
#define MAX_FILE_SIZE           (LEN_RSV_BMP*MAX_EXDP_LEN*16)        // 最大文件字节数 按位图大小设定

typedef struct
{
    int transphase;
    int filetransing;
    int waitcount;

    u8 transActive;		// 传输结构有效
    u8 transflag;		    // 接收进度标志 = 0, 接收未开始; = 1, 正在接收; = 2，接收完成。
    u8 fileType;		        // 文件类型
    u8 fileIdx;			        // 为文件编号，最多支持16个文件
    u16 fileId;			    // 文件ID
    u16 packetSize;		// 包的大小
    u32 packetNum;		// 包的个数

    DataDs16FileHead * pFileHead;
    AppFileHead  * pAppHead;

    u8 * pDatBuff;

    u16 lenBmp;					            // 位图有效长度
    u8 rsvBitmap[LEN_RSV_BMP];	// 文件接收进度标志位图

}FileTransCtrl;


// 传输有效标志定义
#define	TRANS_NONE			0x00    // 无效
#define	TRANS_ACTIVE		0x5A    // 有效

// 传输结果代码定义
#define TRANS_NOT_BEG		0x00    // 没有收到启动命令
#define TRANS_READY		    0x01    	// 准备好接收
#define TRANS_DOING			0x02    // 正在接收
#define TRANS_DONE			0x03    	// 接收完成
#define TRANS_REQUEST      0x04     // 请求传输模式


// 控制动作定义
#define	MOTO_TO_ZERO		0x0001	// 电机归零（辅助调试的功能，无安全保护和逻辑关系）
#define	MOVE_BY_HAND		0x0002	// 电机手动移动（辅助调试的功能，无安全保护和逻辑关系）
#define	OUTPUT_CTRL            0x0003	// 输出控制（辅助调试的功能，无安全保护和逻辑关系）
#define	MOTO_EN_CTRL		    0x0004	// 电机使能控制（辅助调试的功能，无安全保护和逻辑关系）
#define	MANUAL_ACTION		0x0005	// 手动动作功能（日常使用功能，有安全保护和逻辑时序关系）
#define	TEST_OUTPUT	            0x0006	// 测试输出OUTPUT端口(obj输出端口 1~26:主板output1~26 101~356:扩展板output1~256)
#define   TEST_THREADBK		    0x0007// 测试断线检测

// 归零和手动移动和电机使能的 控制参数1 定义
#define	MT_LX                         0x0001	// X向移动电机
#define	MT_LY                         0x0002	// Y向移动电机
#define	MT_LM                        0x0003	// 主轴电机
#define	MT_LN                        0x0004	// 针电机
#define	MT_LU1                      0x0003	// U1电机
#define	MT_LU2                      0x0004	// U2电机
#define	MT_LH                        0x0005	// 梭电机
#define	MT_LU                        0x0006	// 升降电机
#define	MT_ALLZ				     0x0004		// 所有主轴 零位
#define	MT_ALLG				     0x0005		// 所有主轴 勾线
#define	MT_ALLM				     0x0006		// 所有主轴 点动
#define	MT_LF                         0x0007	// 压脚电机
#define	MT_LRR                        0x0008	// 旋转电机
#define	MT_LRU			           0x0009	// 上旋转电机
#define	MT_LRD			           0x000A// 下旋转电机
#define	CUT_THREAD                  0x0001	// 手动剪线
#define	ALL_MS_RUN                  0x0002	// 所有主轴研车
#define	ROTATE_ADJUST			0x0003	// 旋转校对
#define	HEAD_LIFT_UP			    0x0004	//  机头上升
#define	HEAD_LIFT_DOWN			0x0005	// 机头下降
#define	HEAD_LIFT_UPDW			0x0006	// 机头升降
#define	MAINSHAFT_ADJUST		0x0007	// 针梭校对
#define	SEWING_MS_RUN			0x0009	// 缝纫主轴研车
#define   SEWING_MS_JOG			0x0084	// 缝纫机头点动
#define   SEW_HEAD_LIFT        	    0x0012  // 缝纫机头升降（根据传感器状态确定上升还是下降）
#define   SEW_MS_RESET        	    0x0013  // 缝纫针梭复位（回到停车位）
#define   SEW_MS_TO_FIX        	    0x0014  // 缝纫针梭去穿线位（回到穿线位）
#define   SEW_LOCLIP_TRD              0x0015  // 松紧线（根据状态松线或紧线）
#define   XY_MOVE_LEFT                  0x0016  // X左移
#define   XY_MOVE_RIGHT               0x0017  // X右移
#define   XY_MOVE_FRONT             0x0018  // Y前移
#define   XY_MOVE_BACK                0x0019  // Y后移

//平板切割机电机移动
#define   XY_MOVE_LEFT_CUTTING                0x0016  //
#define   XY_MOVE_RIGHT_CUTTING             0x0017  //
#define   XY_MOVE_FRONT_CUTTING               0x0019  //
#define   XY_MOVE_BACK_CUTTING                  0x0018  //

#define	MAKEUP_NOHEAD			0x0020	// 取消补缝
#define	MAKEUP_HEAD1			0x0021	// 机头1补缝
#define	MAKEUP_HEAD2			0x0022	// 机头2补缝
#define	MAKEUP_HEAD3			0x0023	// 机头3补缝
#define	MAKEUP_HEAD4			0x0024	// 机头4补缝
#define	MAKEUP_HEAD5			0x0025	// 机头5补缝

#define   XY_MOVE_STOP                0x001A  // XY停止
#define    SET_WORK_AREA			  0x0001	// 设置可工作区域  手动控制功能,para2是机头 para3选X- X+ Y- Y+,分别对应1234
#define	ALL_MOVE_STOP              0x0040	// 移动停止
#define   AUTO_CHANGE_ONE_SHUT    0x0060  // 自动换一个梭
#define   INSTALL_FIRST_BOBBIN           0x0061  // 安装第一个梭壳
#define   SHUT_FROM_PLATE_TO_HEAD 0x0062  // 将旋梭从梭盘拿到机头
#define   SHUT_FROM_HEAD_TO_PLATE 0x0063  // 将旋梭从机头拿到梭盘
#define   SHUT_INTO_TAKE_PLATE          0x0065  // 进入换梭盘状态
#define   SHUT_INTO_INDX_STA              0x0066  // 进入缝纫状态
#define   HEAD_MOVING_MOTOR          0x0067 //机头移动电机

// 手动控制功能的 代码(控制参数1) 定义
#define KNIFE_COLLECT            0x0005    // 刀压采集
#define KNIFE_U1_TEST            0x0006    // 刀座1刀压测试
#define KNIFE_U2_TEST            0x0007    // 刀座2刀压测试

#define SET_KNIFETEST_POS               0x0009    // 设置刀压检测位置
#define SET_KNIFEROT_POS                0x000A    // 设置被动刀旋转位置
#define PASSIVE_KNIFE_ROT               0x000B	// 被动刀旋转
#define CROSS_CUT                              0x000C    // 横切
#define U1_PASSIVE_KNIFE_ROT        0x000D	// 刀座1被动刀旋转
#define U2_PASSIVE_KNIFE_ROT        0x000E	// 刀座2被动刀旋转


// 手动 控制参数2 定义
#define	MT_MOVE_DIR_STOP	0x0000	// 停止转动
#define	MT_MOVE_DIR_POSI	0x0001	// 正向移动（x向右，y向上，升降向上）
#define	MT_MOVE_DIR_NEGA	0x0002	// 反向移动（x向左，y向下，升降向下）
#define	MT_SERVO_ON			0x0001	// 电机使能开
#define	MT_SERVO_OFF		    0x0002	// 电机使能关

//粗线布线机 手动控制功能的 代码(控制参数1) 定义

#define HEAD_LIFT                0x000A    // 机头升降
#define MS_TO_ANGLE			0x0001	// 主轴去指定角度
#define WIRE_MS_RUN			0x0002	// 主轴研车
#define ROT_TO_ANGLE			0x0003	// 旋转电机去指定角度
#define AUTO_PULL			0x0004	// 自动拉料
#define CUT_UD				0x0005	// 剪底面线
#define CUT_WIRE			0x0006	// 剪电阻丝
#define GOTO_PULLPOS			0x0007	// 回拉料起始点
#define JAW_WORK			0x0008	// 夹布工作状态
#define JAW_FEED			0x0009	// 夹布上料状态
#define ZIGZAG_POS1			0x000A	// 去摆动位1
#define ZIGZAG_POS2			0x000B	// 去摆动位2

#define XY_MOVE_LEFT            0x0016  // X左移
#define XY_MOVE_RIGHT           0x0017  // X右移
#define XY_MOVE_FRONT           0x0018  // Y前移
#define XY_MOVE_BACK            0x0019  // Y后移
#define YPB_MOVE		0x001A	// Y 手动拉料 环带

#define MT_LYPB                0x000C    //
#define MT_LINKRE            0x000D    // 联动退料,只写退料动作
#define MT_LFW            0x000E    // 送电阻丝

#define AUTO_CHANGE_ONE_SHUT    0x0060  // 自动换一个梭
#define INSTALL_FIRST_BOBBIN    0x0061  // 安装第一个梭壳
#define SHUT_FROM_PLATE_TO_HEAD 0x0062  // 将旋梭从梭盘拿到机头
#define SHUT_FROM_HEAD_TO_PLATE 0x0063  // 将旋梭从机头拿到梭盘
#define SHUT_INTO_TAKE_PLATE	0x0065  // 进入更换梭盘状态
#define SHUT_INTO_INDX_STA	0x0066  // 进入缝纫状态
#define SHUT_FEED_STATE     0x000B  // 进入送料状态
#define SHUT_BACK_STATE     0x000C  // 进入收料状态

// 通用输出控制定义
// 输出控制参数1代码定义
#define	OT_LOOSE_THREAD		0x0001	// 松紧线
#define	OT_UCUTTER_LIFT			0x0002	// 上剪刀升降
#define	OT_UCUT_THREAD			0x0003	// 上剪刀剪线
#define	OT_DCUT_THREAD			0x0004	// 下剪刀剪线
#define	OT_FRAME                      0x0005	// 气框
#define	OT_OIL                            0x0006	// 加油
#define	OT_LIGHT				        0x0007	// 照明灯
#define	OT_BIT_FOOT                 0x0008	// 大压脚
#define	OT_MID_FOOT               0x0009	// 中压脚
#define	OT_PUSH_BTRD			    0x000A// 扣底线
#define	OT_STAND_BTRD			0x000B// 顶底线
#define	OT_CLIP_UTRD			    0x000C// 夹面线
#define	OT_LOOSE_UTRD2			0x000D// 松紧线2
#define	OT_SEW_LIFT				    0x000E	// 缝纫机头升降
#define	OT_SEW_BLOW				0x0010	// 缝纫吹气
#define	OT_HEAD_L_CLUTH		0x001A// 左机头主轴离合
#define	OT_HEAD_R_CLUTH		0x001B// 右机头主轴离合
#define	OT_CLIP_EXTEND 			0x0024	// 勾线动作-伸出
#define	OT_CLIP_EXTEND_R 		0x0025	// 右机头勾线动作
#define	OT_CLIP_OPEN 			    0x0026	// 勾线动作-开合
#define	OT_PEN_DOWN			    0x0028	// 画笔升降
#define	OT_CHBOB_GRAB_OPEN		0x0070	// 换梭装置抓取
#define	OT_CHBOB_SWAY_PUSH		0x0071	// 换梭装置摆动
#define	OT_CHBOB_SPIN                    0x0073	// 换梭装置旋转
#define	OT_LASER_CTRL                     0x00F0	// 激光控制
#define	OT_LASER_BLOW                   0x00F1	// 激光吹气
// 输出控制的 控制参数1 定义
#define  OT_MAINADSORB            0x0001    // 吸附总开关
#define  OT_ADSORB1                0x0002    // 吸附1开关
#define  OT_ADSORB2                0x0003    // 吸附2开关
#define  OT_ADSORB3                0x0004    // 吸附3开关
#define  OT_ADSORB4                0x0005    // 吸附4开关
#define  OT_U1_LIFT                0x0006    // U1升降
#define  OT_U2_LIFT                0x0007    // U2升降
// 输出参数2
#define	OT_STOP                     0x0000	// 停止
#define	UP_OPEN_ON             0x0001	// 上升、打开、放松、伸出
#define	DOWN_CLOSE_OFF     0x0002	// 下降、关闭、加紧、收回
#define	OT_ACTION                 0x0003	// 动作


// 通用工作控制功能
#define	WORK_START				0x0001		// 启动工作
#define	WORK_PAUSE				0x0002		// 暂停工作
#define	WORK_FINISH				0x0003		// 结束工作（流程复位）
#define	WORK_FIND_ZERO		0x0004		// 自动找零
#define	WORK_GOTO_START			0x0005		// 回起点
#define	WORK_GOTO_ANCHOR		0x0006		// 回定位点
#define	WORK_GOTO_OFFSET		0x0007		// 回偏移点
#define	WORK_CHECK_FRAME		0x0008		// 边框检查
#define	WORK_CUT_FRAME			0x0009		// 边框切割
#define	WORK_CUT_XLINE			    0x000A	// 手动断布
#define	WORK_FAST_JUMP			    0x000B		// 快速进退
#define	WORK_GOTO_WKPOS		0x000C	// 回工作点
#define	WORK_GOTO_FEEDT			0x000D	// 回穿线点
#define	WORK_GOTO_CHGBO		0x000E		// 回换梭位
#define	WORK_FEED_MOVE			0x000F		// 进料退料
#define	WORK_GOTO_FINISH		    0x0011		// 回结束点
#define	WORK_GOTO_ZERO			0x0012		// 回零点（框架归零）（回绣框原点）
#define    WORK_GOTO_GORNER    0x0013      // 回角点
#define	WORK_MS_JOG		            0x0013		// 主轴点动
#define    WORK_FIX_MVFRAME       0x0017     // 定量移框
#define	WORK_RPM_CHG               0x0020		// 速度改变
#define   WORK_SIMULATION_FRAME	  0x0026		// 空走边框
#define   WORK_GOTO_FEED                  0x0027		// 回上料点
#define   WORK_SET_OFFSET			          0x0028		// 定偏移点
#define   WORK_SET_FEED			              0x0029		// 定上料点
#define   WORK_ACT_OIL			              0x0050		// 工作中加油
#define   AUTO_CHANGE_ONE_SHUT    0x0060      // 自动换一个梭
#define   RESET_SHUT_COUNTER		      0x0067	    // 梭盘计数复位

// 启动工作的参数1定义
#define	WKMD_NORMAL				1	// 正常
#define	WKMD_SIMULATION			2	// 模拟（空走）
#define	WKMD_BACKWORD			3	// 回退



// 命令结构定义
typedef union
{
    DataPacket packet;

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 toggle;
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) getMcInfo;		// UCMD_GET_MC_INFO 读取机器信息

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 toggle;
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) getMcStatus;		// UCMD_GET_MC_STATUS 读取机器状态

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 paraType;
        u16 paraId;
        u8 rev[4];
        u16 crc;
    } __attribute__ ((packed)) getMcParas;		// UCMD_GET_MC_PARAS 读取机器参数

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 fromObj;
        u32 begAddr;
        u16 rdSize;
        u16 crc;
    } __attribute__ ((packed)) getMemData;		// UCMD_GET_MEM_DATA 读取内存数据

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 backType;
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) getSensors;		// UCMD_GET_SENSORS 读取传感信号

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 fileType;
        u8 fileIdx;
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) getFileInfo;		// UCMD_GET_FILE_INFO 读取文件信息

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 fileId;
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) getTransResult;	// UCMD_GET_TRANS_RESULT 读取传输结果

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 rev[8];
        u16 crc;
    } __attribute__ ((packed)) getSensorBmp;		// UCMD_GET_SENSOR_BMP 读取传感信号

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 cfgItem;
        u8 rev[2];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) setMcConfig;		// UCMD_SET_MC_CONFIG 设置机器配置

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 staCode;
        u16 para;
        u8 rev[4];
        u16 crc;
    } __attribute__ ((packed)) setMcStatus;		// UCMD_SET_MC_STATUS 设置机器状态

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 paraType;
        u16 paraId;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) setParas;		// UCMD_SET_MC_PARAS 设置下位机参数

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 setObj;
        u8 setWord;
        u32 setAddr;
        u16 setData;
        u16 crc;
    } __attribute__ ((packed)) setMemData;		// UCMD_SET_MEM_DATA 设置内存数据

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 fileType;
        u8 fileIdx;
        u16 fileId;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) setFileParas;	// UCMD_SET_FILE_PARAS 设置文件参数

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 fileType;
        u8 fileIdx;
        u16 fileId;

        u16 crc;

        u8 exData[MAX_EXDP_LEN];

    } __attribute__ ((packed)) setExecProgress;		// UCMD_SET_EXEC_PROGRESS 设置进度命令

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 rev[4];

        u16 crc;

        u8 exData[MAX_EXDP_LEN];

    } __attribute__ ((packed)) setInstallment;		// UCMD_SET_INSTALLMENT 设置分期密码

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 type;
        u32 time;

        u8 rev[3];
        u16 crc;

    } __attribute__ ((packed)) setElapsedTime;		// UCMD_SET_ELAPSED_TIME 设置经过的时间

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;
        u8 id;
        u8 nodeType;
        u8 rev[6];
        u16 crc;

    } __attribute__ ((packed)) setDefParas;         // UCMD_SET_DEF_PARA 设置默认参数

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 actCode;
        u16 para1;
        u16 para2;
        u16 para3;
        u16 crc;
    } __attribute__ ((packed)) actByhand;		// UCMD_ACT_BYHAND 手动动作功能

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 workCode;
        u32 para1;
        u16 para2;
        u16 crc;
    } __attribute__ ((packed)) mcWork;			// UCMD_MC_WORK 机器工作命令

#pragma pack(1)//设定为1字节对齐
    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        s32 posx;
        s32 posy;
        u16 crc;
    } __attribute__ ((packed)) moveFrameTo;			// UCMD_MOVE_TO 移动框架到位置命令
#pragma pack(1)//设定为1字节对齐

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 fileType;
        u8 fileIdx;
        u16 fileId;

        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) startTrans;		// UCMD_START_TRANS 启动文件传输

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 pktIdx;
        u16 fileId;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) transFileData;		// UCMD_TRANS_FILE_DATA 文件数据传输

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u32 fileIdxMap;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) setFilesList;		// UCMD_SET_FILE_LIST 设置文件列表

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 rev[8];

        u16 crc;

    } __attribute__ ((packed)) getFilesList;		// UCMD_GET_FILE_LIST 读取文件列表

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 upObj;
        u16 upFileID;
        u32 checksum;
        u16 crc;
    } __attribute__ ((packed)) mcUpdate;			// UCMD_MC_UPDATE 系统升级


    //----------------------------------
    // 下位机发送命令
    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 fileType;
        u8 fileIdx;
        u16 fileId;
        u32 datBlockIdx;	// 数据包索引（每个包1024字节)

        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dRequestDatBlock;		// DCMD_REQUEST_DAT 请求文件数据

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 toggle;
        u8 rev[2];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendMcInfo;			// DCMD_SEND_MC_INFO 发送机器信息

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 toggle;
        u8 rev[2];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendMcStatus;		// DCMD_SEND_MC_STATUS 发送机器状态

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 paraType;
        u16 paraId;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendMcParas;			// DCMD_SEND_MC_PARAS 发送机器参数

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u32 begAddr;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendMemData;			// DCMD_SEND_MEM_DATA 发送内存数据

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 rev[4];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendSensors;			// DCMD_SEND_SENSORS 发送传感信号

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 fileType;
        u8 fileIdx;
        u8 rev[2];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendFileInfo;		// DCMD_SEND_FILE_INFO 发送文件信息

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u16 fileId;
        u8 active;
        u8 result;
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendTransResult;		// DCMD_SEND_TRANS_RESULT 发送传输结果

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;


        u16 exLen;
        u16 exCrc;

        u8 rev[4];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) dSendSensorBmp;		// DCMD_SEND_SENSOR_BMP 发送传输结果

    struct
      {
          u8 sync[DP_SYNC_LEN];
          u16 cmdCode;

          u16 exLen;
          u16 exCrc;

          u8  fileType;
          u8  fileIdx;
          u16 fileId;

          u16 crc;

          u8 exData[MAX_EXDP_LEN];

      } __attribute__ ((packed)) setMacKey;		// setMacKey

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 protocolType;		// 协议类型
        u8 nodeType;			// 遍历节点类型
        u8 traNum;				// 遍历个数
        u8 nodeId;				// 遍历起始节点ID
        u8 rev[4];
        u16 crc;
    } __attribute__ ((packed)) traverse;		// 遍历命令

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 rev[8];
        u16 crc;
    } __attribute__ ((packed)) rdBoardVer;		// 读取外围板程序版本

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u8 protocolType;		// 协议类型
        u8 nodeId;				// 节点ID
        u8 rev[6];
        u16 crc;
    } __attribute__ ((packed)) updateBoard;		// 升级外围板

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 protocolType;
        u8 nodeId;         //节点ID
        u8 nodeType;    //节点类型    -rq
        u8 rev;
        u16 crc;

        u32 ver[8];
        u8 exData[MAX_EXDP_LEN-32];
    } __attribute__ ((packed)) sendBoardVer;			// 发送外围板程序版本

    struct
    {
        u8 sync[DP_SYNC_LEN];
        u16 cmdCode;

        u16 exLen;
        u16 exCrc;

        u8 nodeId;
        u8 nodeType;			// 节点类型
        u8 rev[2];
        u16 crc;

        u8 exData[MAX_EXDP_LEN];
    } __attribute__ ((packed)) boardPara;			// 发送外围板非易失性参数

}OperPacket;
#pragma pack(1)//设定为1字节对齐


#endif
